package com.woniuxy.service.impl;

import com.woniuxy.controller.RAGFileController;
import com.woniuxy.entity.CustomizationMessage;
import com.woniuxy.entity.SessionMessages;
import com.woniuxy.service.AIService;
import kotlin.contracts.Returns;
import org.springframework.ai.chat.client.ChatClient;
import org.springframework.ai.document.Document;
import org.springframework.ai.image.ImagePrompt;
import org.springframework.ai.vectorstore.SearchRequest;
import org.springframework.ai.vectorstore.redis.RedisVectorStore;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import reactor.core.publisher.Flux;

import java.util.List;

/**
 * @Author: 马宇航
 * @Todo: TODO
 * @DateTime: 25/09/10/星期三 14:19
 * @Component: 成都蜗牛学苑
 **/
@Service
public class AIServiceImpl implements AIService {
    @Autowired
    ChatClient chatClient;
    @Autowired
    RedisVectorStore redisVectorStore;
    @Autowired
    RAGFileController ragFileController;
    @Override
    public Flux<String> streamAI(SessionMessages message) {
//        List<CustomizationMessage> messages = message.getMessages();
        String question = message.getQuestion();
        //获取文件列表名字
        List<String> filesPath = message.getFilesPath();
        //有文件
        if(filesPath.size() != 0){
            //如果用户说的是帮我向量化文件
              return chatClient.prompt("如果用户说了向量化，才调用工具执行文件向量化处理，否则不要说准备向量化。").user(question+filesPath)
                        .tools(ragFileController) //new 对象再走，不会调用spring的注解
//                        .toolNames("RAGFileController")  //利用bean的名字来调用，依赖注入，spring注解效果
                        .stream()
                        .content();
        }
        //前端发来的最后一条用户消息
//        String content = messages.get(messages.size()-1).getContent();
        //RAG的向量搜索，找到的问题相关的文章内容
        List<Document> documents = redisVectorStore.similaritySearch(SearchRequest.builder()
                .topK(5)
                .query(question)
                .similarityThreshold(0.5)
                .build());
        //AI 携带这些文档内容，一起提交给AI
        return chatClient.prompt(documents.toString()).user(question).stream().content();
    }
}
